package leetcode.pre100;

import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

/**
 * 给定一个正整数 n，生成一个包含 1 到 n2 所有元素，且元素按顺时针顺序螺旋排列的正方形矩阵。
 * <p>
 * 示例:
 * <p>
 * 输入: 3
 * 输出:
 * [
 * [ 1, 2, 3 ],
 * [ 8, 9, 4 ],
 * [ 7, 6, 5 ]
 * ]
 * 其他类似题目{@link baseclass.c_globalToPartMatrix.Code02_Rotate90}
 * 其他类似题目{@link baseclass.c_globalToPartMatrix.Code03_ZigZagPrintMatrix}
 * 其他类似题目{@link baseclass.c_matrix.FindMaxOrMinInMatrix}
 * <p>
 * 同顺时针打印一样，只不过打印变成赋值
 *
 * @date 2020/2/27 22:11
 */
public class Code59_PrintMatrix_螺旋矩阵2 {
    public static void main(String[] args) {

        int[][]m =spiralOrderPrint(3);
        for (int[] ints : m) {
            System.out.println(Arrays.toString(ints));
        }
    }

    private static int num = 1;

    public static int[][] spiralOrderPrint(int n) {
        if (n <= 0) {
            return new int[0][0];
        }
        int[][] matrix = new int[n][n];
        int a = 0;
        int b = 0;
        //矩阵的行数
        int c = matrix.length - 1;
        //矩阵的列数
        int d = matrix[0].length - 1;
        //左上角 始终不能超 右下角
        while (a <= c && b <= d) {
            print(matrix, a++, b++, c--, d--);
        }
        return matrix;
    }

    public static void print(int[][] m, int a, int b, int c, int d) {
        //只有一行
        if (a == c) {
            for (int i = b; i <= d; i++) {
//                System.out.println(m[a][i]);
                m[a][i] = num++;
            }
            return;
        }
        //只有一列
        if (b == d) {
            for (int i = a; i <= c; i++) {
//                System.out.println(m[i][b]);
                m[i][b] = num++;
            }
            return;
        }
        int curCol = b;
        //从左到右
        for (; curCol < d; curCol++) {
//            System.out.println(m[a][curCol]);
            m[a][curCol] = num++;
        }
        //从上到下
        int curRow = a;
        for (; curRow < c; curRow++) {
//            System.out.println(m[curRow][d]);
            m[curRow][d] = num++;
        }
        //从右到左
        for (curCol = d; curCol > b; curCol--) {
//            System.out.println(m[c][curCol]);
            m[c][curCol] = num++;
        }
        //从下到上
        for (curRow = c; curRow > a; curRow--) {
//            System.out.println(m[curRow][b]);
            m[curRow][b] = num++;
        }
    }
}
